// 引入的 { Request, Response, NextFunction } from 'express' 为引入了 Request、Response、NextFunction 三个类型注解
import express, { Request, Response, NextFunction } from "express";
// 引入请求体解析器
import bodyParser from "body-parser";
// 引入持久存储中间件
import cookieSession from "cookie-session";
// 引入 LoginController 类，执行装饰器上的方法，自动生成路由
import "./controller/LoginController";
import "./controller/CrowllerController";
// 引入由装饰器生成的路由（新方法引入路由）
import router from "./router";
// 引入路由文件（该路由文件引用方式为原始引用方式，现已被废弃）
// import router from "./router";

// 创建服务器
const app = express();
// express 库的问题：
// 问题1：express 库的类型定义文件 .d.ts 文件类型描述不准确
// 这个问题在 router.ts 文件中做了解决
// 问题2：当我们使用中间件的时候，对 req 或者 res 做了修改之后，实际上并不能改变类型的定义
// 解决这个问题我们可以通过类型融合来解决：手动创建 custom.d.ts 文件

// 使用请求体解析器中间件
app.use(bodyParser.urlencoded({ extended: true }));
// 使用中间件进行请求拦截
app.use((req: Request, res: Response, next: NextFunction) => {
  req.teacherName = "Lyc";
  next();
});
// 使用持久化存储中间件
app.use(
  cookieSession({
    name: "session",
    /* secret keys */
    keys: ["lyc"],
    // Cookie Options
    maxAge: 24 * 60 * 60 * 1000, // 24 hours，有效时长
  })
);
// 使用路由中间件
app.use(router);

// 启动服务器
app.listen(7001, () => {
  console.log("server is running");
});
